package powerdev.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.ArrayList;
import java.util.Collection;

import powerdev.excepcion.DAOExcepcion;
import powerdev.modelo.Alquiler;
import powerdev.modelo.Cancha;
import powerdev.modelo.Cliente;
import powerdev.util.ConexionBD;

public class AlquilerDAO extends BaseDAO {
	
	public Collection<Alquiler> buscarRefAlquiler(java.util.Date fe_Dia, Time nu_HoraI, Time nu_HoraF, int co_Cancha) throws DAOExcepcion {
		System.out.println("AlquilerDAO: buscarRefAlquiler(Date fe_Dia, Time nu_HoraI, Time nu_HoraF, int co_Cancha)");
		String query = "SELECT co_Alquiler, fe_Dia, nu_HoraI, nu_HoraF, ss_Alquiler, ss_Servicio, ss_Total, fl_EstadoPago, co_Cancha, co_Persona, fl_Estado " +
				"FROM Alquiler WHERE fe_Dia=? and nu_HoraI=? and nu_HoraF=? and co_Cancha=?";
		Collection<Alquiler> lista = new ArrayList<Alquiler>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDate(1,(Date) fe_Dia);
			stmt.setTime(2, nu_HoraI);
			stmt.setTime(3, nu_HoraF);
			stmt.setInt(4, co_Cancha);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Alquiler vo = new Alquiler();
				vo.setCo_Alquiler(rs.getInt("co_Alquiler"));
				vo.setFe_Dia(rs.getDate("fe_Dia"));
				vo.setNu_HoraI(rs.getTime("nu_HoraI"));
				vo.setNu_HoraF(rs.getTime("nu_HoraF"));
				vo.setSs_Alquiler(rs.getDouble("ss_Alquiler"));
				vo.setSs_Servicio(rs.getDouble("ss_Servicio"));
				vo.setSs_Total(rs.getDouble("ss_Total"));
				vo.setFl_EstadoPago(rs.getBoolean("fl_EstadoPago"));
				vo.setFl_Estado(rs.getBoolean("fl_Estado"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	
 public void insertar(Alquiler vo, int co_Cancha, int co_Persona) throws DAOExcepcion {
		System.out.println("AlquilerDAO: insertar(Alquiler vo)");
		String query = "INSERT INTO Alquiler(co_Alquiler, fe_Dia, nu_HoraI, nu_HoraF, ss_Alquiler, ss_Servicio, ss_Total, fl_EstadoPago, co_Cancha, co_Persona, fl_Estado) " +
				"VALUES (?,?,?,?,?,?,?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, vo.getCo_Alquiler());
			stmt.setDate(2, (Date) vo.getFe_Dia());
			stmt.setTime(3, (Time) vo.getNu_HoraI());
			stmt.setTime(4, (Time) vo.getNu_HoraF());
			stmt.setDouble(5, vo.getSs_Alquiler());
			stmt.setDouble(6, vo.getSs_Servicio());
			stmt.setDouble(7, vo.getSs_Total());
			stmt.setBoolean(8, vo.isFl_EstadoPago());
			stmt.setInt(9, co_Cancha);
			stmt.setInt(10, co_Persona);
			stmt.setBoolean(11, vo.isFl_Estado());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Alquiler obtener(int co_Alquiler) throws DAOExcepcion {
		System.out.println("AlquilerDAO: obtener(int co_Alquiler)");
		Alquiler vo = new Alquiler();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT co_Alquiler, fe_Dia, nu_HoraI, nu_HoraF, ss_Alquiler, ss_Servicio, ss_Total, fl_EstadoPago, co_Cancha, co_Persona, fl_Estado " +
					"FROM Alquiler WHERE co_Alquiler= ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, co_Alquiler);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCo_Alquiler(rs.getInt("co_Alquiler"));
				vo.setFe_Dia(rs.getDate("fe_Dia"));
				vo.setNu_HoraI(rs.getTime("nu_HoraI"));
				vo.setNu_HoraF(rs.getTime("nu_HoraF"));
				vo.setSs_Alquiler(rs.getDouble("ss_Alquiler"));
				vo.setSs_Servicio(rs.getDouble("ss_Servicio"));
				vo.setSs_Total(rs.getDouble("ss_Total"));
				vo.setFl_EstadoPago(rs.getBoolean("fl_EstadoPago"));
				vo.setFl_Estado(rs.getBoolean("fl_Estado"));	
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	//  public void eliminar(String rolNombre) throws DAOExcepcion {
	//	System.out.println("RolDAO: eliminar(String rolNombre)");
	//	String query = "DELETE FROM rol WHERE rol_nombre=?";
	//	Connection con = null;
	//	PreparedStatement stmt = null;
	//	try {
	//		con = ConexionBD.obtenerConexion();
	//		stmt = con.prepareStatement(query);
	//		stmt.setString(1, rolNombre);
	//		int i = stmt.executeUpdate();
	//		if (i != 1) {
	//			throw new SQLException("No se pudo eliminar");
	//		}
	//	} catch (SQLException e) {
	//		System.err.println(e.getMessage());
	//		throw new DAOExcepcion(e.getMessage());
	//	} finally {
	//		this.cerrarStatement(stmt);
	//		this.cerrarConexion(con);
	//	}
	//	}  
	
	public void Anular_Alquiler(int co_Alquiler, Boolean fl_Estado) throws DAOExcepcion {
		System.out.println("AlquilerDAO: Anular_Alquiler(int co_Alquiler)");
		String query = "update Alquiler set fl_Estado=? where co_Alquiler=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setBoolean(1, fl_Estado);
			stmt.setInt(2, co_Alquiler);
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}


	public void actualizar(Alquiler vo, int co_Cancha, int co_Persona) throws DAOExcepcion {
		System.out.println("AlquilerDAO: actualizar(Alquiler vo)");
		String query = "update Alquiler set fe_Dia=?, nu_HoraI=?, nu_HoraF=?, ss_Alquiler=?, ss_Servicio=?, ss_Total=?, fl_EstadoPago=?, " +
				"co_Cancha=?, co_Persona=?, fl_Estado=? where co_Alquiler=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDate(1, (Date) vo.getFe_Dia());
			stmt.setTime(2, (Time) vo.getNu_HoraI());
			stmt.setTime(3, (Time) vo.getNu_HoraF());
			stmt.setDouble(4, vo.getSs_Alquiler());
			stmt.setDouble(5, vo.getSs_Servicio());
			stmt.setDouble(6, vo.getSs_Total());
			stmt.setBoolean(7, vo.isFl_EstadoPago());
			stmt.setInt(8, co_Cancha);
			stmt.setInt(9, co_Persona);
			stmt.setBoolean(10, vo.isFl_Estado());
			stmt.setInt(11, vo.getCo_Alquiler());
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	public Collection<Alquiler> listar() throws DAOExcepcion {
		System.out.println("AlquilerDAO: listar()");
		Collection<Alquiler> c = new ArrayList<Alquiler>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "SELECT co_Alquiler, fe_Dia, nu_HoraI, nu_HoraF, ss_Alquiler, ss_Servicio, ss_Total, fl_EstadoPago, co_Cancha, co_Persona, fl_Estado " +
				"FROM Alquiler";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Alquiler vo = new Alquiler();
				vo.setCo_Alquiler(rs.getInt("co_Alquiler"));
				vo.setFe_Dia(rs.getDate("fe_Dia"));
				vo.setNu_HoraI(rs.getTime("nu_HoraI"));
				vo.setNu_HoraF(rs.getTime("nu_HoraF"));
				vo.setSs_Alquiler(rs.getDouble("ss_Alquiler"));
				vo.setSs_Servicio(rs.getDouble("ss_Servicio"));
				vo.setSs_Total(rs.getDouble("ss_Total"));
				vo.setFl_EstadoPago(rs.getBoolean("fl_EstadoPago"));
				vo.setFl_Estado(rs.getBoolean("fl_Estado"));	
				c.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}


	public Collection<Alquiler> listar(int co_Local, String fe_Inicio, String fe_Fin) throws DAOExcepcion {                 
		//System.out.println("AlquilerDAO: listar(int co_Local, String fe_Inicio, String fe_Fin)");  
		Collection<Alquiler> c = new ArrayList<Alquiler>();                
		Connection con = null;                
		PreparedStatement stmt = null;                 
		ResultSet rs = null;                 
		try {                        
			con = ConexionBD.obtenerConexion();                        
			String query = "SELECT A.co_Alquiler, A.fe_Dia, A.nu_HoraI, A.nu_HoraF, A.ss_Alquiler, A.ss_Servicio, A.ss_Total, " +                                                                
			"A.fl_EstadoPago, A.co_Cancha, A.co_Persona, A.fl_Estado, C.co_Cancha, C.no_Canacha, C.tx_Caracteristicas, " +                                                                 
					"C.no_Foto, C.co_Local, C.co_Tipo, L.co_Local, L.no_Local, L.tx_Direccion, L.tx_GoogleMaps, L.nu_Telefono, L.co_Distrito " +                                                         
			"FROM Alquiler A " +                                                        
			"INNER JOIN Cancha C on A.co_Cancha = C.co_Cancha " +                                                        
			"INNER JOIN Localx L on C.co_Cancha = L.co_Local " +                                                         
			"WHERE L.co_Local = ? " +                                                         
			"AND A.fe_Dia BETWEEN ? AND ?";                         
			stmt = con.prepareStatement(query);                         
			stmt.setInt(1, co_Local);                         
			stmt.setString(2, fe_Inicio);                        
			stmt.setString(3, fe_Fin);                         
			rs = stmt.executeQuery();                        
			while (rs.next()) {                                
				Alquiler vo = new Alquiler();                                
				Cliente cli = new Cliente();                                
				Cancha can = new Cancha();                                                                 
				vo.setCo_Alquiler(rs.getInt("co_Alquiler"));                                
				vo.setFe_Dia(rs.getDate("fe_Dia"));                                 
				vo.setNu_HoraI(rs.getTime("nu_HoraI"));                                 
				vo.setNu_HoraF(rs.getTime("nu_HoraF"));                                
				vo.setSs_Alquiler(rs.getDouble("ss_Alquiler"));                                
				vo.setSs_Servicio(rs.getDouble("ss_Servicio"));                                
				vo.setSs_Total(rs.getDouble("ss_Total"));                                 
				vo.setFl_EstadoPago(rs.getBoolean("fl_EstadoPago"));                                 
				cli.setCo_Persona(rs.getInt("co_Persona"));                                 
				vo.setoCliente(cli);                                 
				can.setCo_Cancha(rs.getInt("co_Cancha"));                                
				vo.setoCancha(can);                                  
				vo.setFl_Estado(rs.getBoolean("fl_Estado"));                                    
				c.add(vo);                         
				}                 
			} catch (SQLException e) {                         
				System.err.println(e.getMessage());                        
				throw new DAOExcepcion(e.getMessage());                
				} finally {                        
					this.cerrarStatement(stmt);                         
					this.cerrarConexion(con);                 
					}                 
		return c;         
		} 
	
	public void actualizarMontoAlquiler(double ss_Servicio, double ss_Total, int co_Alquiler) throws DAOExcepcion {
		System.out.println("AlquilerDAO: actualizar(Alquiler vo)");
		String query = "update Alquiler set ss_Servicio=?, ss_Total=? where co_Alquiler=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDouble(1, ss_Servicio);
			stmt.setDouble(2, ss_Total);
			stmt.setInt(3, co_Alquiler);
			
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
	}
	
	
	
